package com.zh.juc.jmm;

import java.util.concurrent.TimeUnit;

/**
 * @Author: zhanghuan
 * @date: 2022/10/12 19:23
 * @description: create it
 * java内存模型 虚拟概念
 * 作用：
 * 1.实现线程和主内存之间的抽象关系
 * 2.屏蔽各个硬件平台和操作系统内存访问差异 实现java程序再各种平台下达到一致的内存访问
 * 三大特性：
 * 可见性：当一个线程修改了一个共享变量，其他线程是否立即知道该变更
 * 原子性：
 * 有序性：
 * 多线程对变量的读写过程？
 * <p>
 * happens-before
 * 1.次序规则
 * 一个线程内,按照代码顺序,写在前面的操作先行发生于写在后面的操作(强调的是一个线程)
 * 前一个操作的结果可以被后续的操作获取。将白点就是前面一个操作把变量X赋值为1,那后面一个操作肯定能知道X已经变成了1
 * 2.锁定规则
 * (一个unlock操作先行发生于后面((这里的"后面"是指时间上的先后))对同一个锁的lock操作(上一个线程unlock了,下一个线程才能获取到锁,进行lock))
 * <p>
 * 3.volatile变量规则
 * (对一个volatile变量的写操作先行发生于后面对这个变量的读操作,前面的写对后面的读是可见的,这里的"后面"同样是指时间是的先后)
 * <p>
 * 4.传递规则
 * (如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出A先行发生于操作C)
 * <p>
 * 5.线程启动规则(Thread Start Rule)
 * (Thread对象的start( )方法先行发生于线程的每一个动作)
 * <p>
 * 6.线程中断规则(Thread Interruption Rule)
 * <p>
 * 对线程interrupt( )方法的调用先发生于被中断线程的代码检测到中断事件的发生
 * 可以通过Thread.interrupted( )检测到是否发生中断
 * 7. 线程终止规则(Thread Termination Rule)
 * (线程中的所有操作都先行发生于对此线程的终止检测)
 * <p>
 * 8.对象终结规则(Finalizer Rule)
 * (对象没有完成初始化之前,是不能调用finalized( )方法的 )
 */
public class JmmDemo {
    private volatile int value = 0;

    public int getValue() {
        return value;
    }

    public synchronized int setValue() {
        return ++value;
    }

    public static void main(String[] args) {

        // 不能确定t1,t2 谁先执行
        // t1 先 ---> 1， 1
        // t2 先 --->0， 1
        JmmDemo jmmDemo = new JmmDemo();
        new Thread(() -> {
            System.out.println(jmmDemo.setValue());
        }, "t1").start();

        new Thread(() -> {
            System.out.println(jmmDemo.getValue());
        }, "t2").start();


    }
}
